//
// Jaguar memory and I/O physical (hosted!) memory
//
// by James Hammons
//
// JLH = James Hammons
//
// WHO  WHEN        WHAT
// ---  ----------  -----------------------------------------------------------
// JLH  12/10/2009  Repurposed this file. :-)
//

#include "memory.h"

uint8_t jagMemSpace[0xF20000];

uint8_t * jaguarMainRAM = &jagMemSpace[0x000000];
uint8_t * jaguarMainROM = &jagMemSpace[0x800000];
uint8_t * cdRAM         = &jagMemSpace[0xDFFF00];
uint8_t * gpuRAM        = &jagMemSpace[0xF03000];
uint8_t * dspRAM        = &jagMemSpace[0xF1B000];

uint32_t & butch     = *((uint32_t *)&jagMemSpace[0xDFFF00]);	// base of Butch == interrupt control register, R/W
uint32_t & dscntrl   = *((uint32_t *)&jagMemSpace[0xDFFF04]);	// DSA control register, R/W
uint16_t & ds_data   = *((uint16_t *)&jagMemSpace[0xDFFF0A]);	// DSA TX/RX data, R/W
uint32_t & i2cntrl   = *((uint32_t *)&jagMemSpace[0xDFFF10]);	// i2s bus control register, R/W
uint32_t & sbcntrl   = *((uint32_t *)&jagMemSpace[0xDFFF14]);	// CD subcode control register, R/W
uint32_t & subdata   = *((uint32_t *)&jagMemSpace[0xDFFF18]);	// Subcode data register A
uint32_t & subdatb   = *((uint32_t *)&jagMemSpace[0xDFFF1C]);	// Subcode data register B
uint32_t & sb_time   = *((uint32_t *)&jagMemSpace[0xDFFF20]);	// Subcode time and compare enable (D24)
uint32_t & fifo_data = *((uint32_t *)&jagMemSpace[0xDFFF24]);	// i2s FIFO data
uint32_t & i2sdat2   = *((uint32_t *)&jagMemSpace[0xDFFF28]);	// i2s FIFO data (old)
uint32_t & unknown   = *((uint32_t *)&jagMemSpace[0xDFFF2C]);	// Seems to be some sort of I2S interface

uint16_t & memcon1   = *((uint16_t *)&jagMemSpace[0xF00000]);
uint16_t & memcon2   = *((uint16_t *)&jagMemSpace[0xF00002]);
uint16_t & hc        = *((uint16_t *)&jagMemSpace[0xF00004]);
uint16_t & vc        = *((uint16_t *)&jagMemSpace[0xF00006]);
uint16_t & lph       = *((uint16_t *)&jagMemSpace[0xF00008]);
uint16_t & lpv       = *((uint16_t *)&jagMemSpace[0xF0000A]);
uint64_t & obData    = *((uint64_t *)&jagMemSpace[0xF00010]);
uint32_t & olp       = *((uint32_t *)&jagMemSpace[0xF00020]);
uint16_t & obf       = *((uint16_t *)&jagMemSpace[0xF00026]);
uint16_t & vmode     = *((uint16_t *)&jagMemSpace[0xF00028]);
uint16_t & bord1     = *((uint16_t *)&jagMemSpace[0xF0002A]);
uint16_t & bord2     = *((uint16_t *)&jagMemSpace[0xF0002C]);
uint16_t & hp        = *((uint16_t *)&jagMemSpace[0xF0002E]);
uint16_t & hbb       = *((uint16_t *)&jagMemSpace[0xF00030]);
uint16_t & hbe       = *((uint16_t *)&jagMemSpace[0xF00032]);
uint16_t & hs        = *((uint16_t *)&jagMemSpace[0xF00034]);
uint16_t & hvs       = *((uint16_t *)&jagMemSpace[0xF00036]);
uint16_t & hdb1      = *((uint16_t *)&jagMemSpace[0xF00038]);
uint16_t & hdb2      = *((uint16_t *)&jagMemSpace[0xF0003A]);
uint16_t & hde       = *((uint16_t *)&jagMemSpace[0xF0003C]);
uint16_t & vp        = *((uint16_t *)&jagMemSpace[0xF0003E]);
uint16_t & vbb       = *((uint16_t *)&jagMemSpace[0xF00040]);
uint16_t & vbe       = *((uint16_t *)&jagMemSpace[0xF00042]);
uint16_t & vs        = *((uint16_t *)&jagMemSpace[0xF00044]);
uint16_t & vdb       = *((uint16_t *)&jagMemSpace[0xF00046]);
uint16_t & vde       = *((uint16_t *)&jagMemSpace[0xF00048]);
uint16_t & veb       = *((uint16_t *)&jagMemSpace[0xF0004A]);
uint16_t & vee       = *((uint16_t *)&jagMemSpace[0xF0004C]);
uint16_t & vi        = *((uint16_t *)&jagMemSpace[0xF0004E]);
uint16_t & pit0      = *((uint16_t *)&jagMemSpace[0xF00050]);
uint16_t & pit1      = *((uint16_t *)&jagMemSpace[0xF00052]);
uint16_t & heq       = *((uint16_t *)&jagMemSpace[0xF00054]);
uint32_t & bg        = *((uint32_t *)&jagMemSpace[0xF00058]);
uint16_t & int1      = *((uint16_t *)&jagMemSpace[0xF000E0]);
uint16_t & int2      = *((uint16_t *)&jagMemSpace[0xF000E2]);
uint8_t  * clut      =   (uint8_t *) &jagMemSpace[0xF00400];
uint8_t  * lbuf      =   (uint8_t *) &jagMemSpace[0xF00800];
uint32_t & g_flags   = *((uint32_t *)&jagMemSpace[0xF02100]);
uint32_t & g_mtxc    = *((uint32_t *)&jagMemSpace[0xF02104]);
uint32_t & g_mtxa    = *((uint32_t *)&jagMemSpace[0xF02108]);
uint32_t & g_end     = *((uint32_t *)&jagMemSpace[0xF0210C]);
uint32_t & g_pc      = *((uint32_t *)&jagMemSpace[0xF02110]);
uint32_t & g_ctrl    = *((uint32_t *)&jagMemSpace[0xF02114]);
uint32_t & g_hidata  = *((uint32_t *)&jagMemSpace[0xF02118]);
uint32_t & g_divctrl = *((uint32_t *)&jagMemSpace[0xF0211C]);
uint32_t g_remain;
uint32_t & a1_base   = *((uint32_t *)&jagMemSpace[0xF02200]);
uint32_t & a1_flags  = *((uint32_t *)&jagMemSpace[0xF02204]);
uint32_t & a1_clip   = *((uint32_t *)&jagMemSpace[0xF02208]);
uint32_t & a1_pixel  = *((uint32_t *)&jagMemSpace[0xF0220C]);
uint32_t & a1_step   = *((uint32_t *)&jagMemSpace[0xF02210]);
uint32_t & a1_fstep  = *((uint32_t *)&jagMemSpace[0xF02214]);
uint32_t & a1_fpixel = *((uint32_t *)&jagMemSpace[0xF02218]);
uint32_t & a1_inc    = *((uint32_t *)&jagMemSpace[0xF0221C]);
uint32_t & a1_finc   = *((uint32_t *)&jagMemSpace[0xF02220]);
uint32_t & a2_base   = *((uint32_t *)&jagMemSpace[0xF02224]);
uint32_t & a2_flags  = *((uint32_t *)&jagMemSpace[0xF02228]);
uint32_t & a2_mask   = *((uint32_t *)&jagMemSpace[0xF0222C]);
uint32_t & a2_pixel  = *((uint32_t *)&jagMemSpace[0xF02230]);
uint32_t & a2_step   = *((uint32_t *)&jagMemSpace[0xF02234]);
uint32_t & b_cmd     = *((uint32_t *)&jagMemSpace[0xF02238]);
uint32_t & b_count   = *((uint32_t *)&jagMemSpace[0xF0223C]);
uint64_t & b_srcd    = *((uint64_t *)&jagMemSpace[0xF02240]);
uint64_t & b_dstd    = *((uint64_t *)&jagMemSpace[0xF02248]);
uint64_t & b_dstz    = *((uint64_t *)&jagMemSpace[0xF02250]);
uint64_t & b_srcz1   = *((uint64_t *)&jagMemSpace[0xF02258]);
uint64_t & b_srcz2   = *((uint64_t *)&jagMemSpace[0xF02260]);
uint64_t & b_patd    = *((uint64_t *)&jagMemSpace[0xF02268]);
uint32_t & b_iinc    = *((uint32_t *)&jagMemSpace[0xF02270]);
uint32_t & b_zinc    = *((uint32_t *)&jagMemSpace[0xF02274]);
uint32_t & b_stop    = *((uint32_t *)&jagMemSpace[0xF02278]);
uint32_t & b_i3      = *((uint32_t *)&jagMemSpace[0xF0227C]);
uint32_t & b_i2      = *((uint32_t *)&jagMemSpace[0xF02280]);
uint32_t & b_i1      = *((uint32_t *)&jagMemSpace[0xF02284]);
uint32_t & b_i0      = *((uint32_t *)&jagMemSpace[0xF02288]);
uint32_t & b_z3      = *((uint32_t *)&jagMemSpace[0xF0228C]);
uint32_t & b_z2      = *((uint32_t *)&jagMemSpace[0xF02290]);
uint32_t & b_z1      = *((uint32_t *)&jagMemSpace[0xF02294]);
uint32_t & b_z0      = *((uint32_t *)&jagMemSpace[0xF02298]);
uint16_t & jpit1     = *((uint16_t *)&jagMemSpace[0xF10000]);
uint16_t & jpit2     = *((uint16_t *)&jagMemSpace[0xF10002]);
uint16_t & jpit3     = *((uint16_t *)&jagMemSpace[0xF10004]);
uint16_t & jpit4     = *((uint16_t *)&jagMemSpace[0xF10006]);
uint16_t & clk1      = *((uint16_t *)&jagMemSpace[0xF10010]);
uint16_t & clk2      = *((uint16_t *)&jagMemSpace[0xF10012]);
uint16_t & clk3      = *((uint16_t *)&jagMemSpace[0xF10014]);
uint16_t & j_int     = *((uint16_t *)&jagMemSpace[0xF10020]);
uint16_t & asidata   = *((uint16_t *)&jagMemSpace[0xF10030]);
uint16_t & asictrl   = *((uint16_t *)&jagMemSpace[0xF10032]);
uint16_t asistat;
uint16_t & asiclk    = *((uint16_t *)&jagMemSpace[0xF10034]);
uint16_t & joystick  = *((uint16_t *)&jagMemSpace[0xF14000]);
uint16_t & joybuts   = *((uint16_t *)&jagMemSpace[0xF14002]);
uint32_t & d_flags   = *((uint32_t *)&jagMemSpace[0xF1A100]);
uint32_t & d_mtxc    = *((uint32_t *)&jagMemSpace[0xF1A104]);
uint32_t & d_mtxa    = *((uint32_t *)&jagMemSpace[0xF1A108]);
uint32_t & d_end     = *((uint32_t *)&jagMemSpace[0xF1A10C]);
uint32_t & d_pc      = *((uint32_t *)&jagMemSpace[0xF1A110]);
uint32_t & d_ctrl    = *((uint32_t *)&jagMemSpace[0xF1A114]);
uint32_t & d_mod     = *((uint32_t *)&jagMemSpace[0xF1A118]);
uint32_t & d_divctrl = *((uint32_t *)&jagMemSpace[0xF1A11C]);
uint32_t d_remain;
uint32_t & d_machi   = *((uint32_t *)&jagMemSpace[0xF1A120]);
uint16_t & ltxd      = *((uint16_t *)&jagMemSpace[0xF1A148]);
uint16_t lrxd;
uint16_t & rtxd      = *((uint16_t *)&jagMemSpace[0xF1A14C]);
uint16_t rrxd;
uint8_t  & sclk      = *((uint8_t *) &jagMemSpace[0xF1A150]);
uint8_t sstat;
uint32_t & smode     = *((uint32_t *)&jagMemSpace[0xF1A154]);
